# 1.6 : 一个能将键(key)映射到多个值的字典(一键多值)
from collections import defaultdict  # defaultdict类就好像是一个dict，但是它是使用一个类型来初始化的
d = defaultdict(list)
d['a'].append(1)
d['a'].append(2)
d['b'].append(3)
d['b'].append(4)
#print(d)

# 1.7 : 创建一个字典,同时对字典做迭代或序列化操作时,也能控制其中的元素顺序
from collections import OrderedDict  #会严格按照元素初始添加的顺序进行
d2 = OrderedDict()
d2['foo'] = 1
d2['nar'] = 2
d2['spam'] = 3
d2['grok'] = 4
for key in d2:
    print(key,d2[key])

# 如果以后对内容做序列化特别方便, 如:
import json
print(json.dumps(d2))

# 1.8 :在字典上对数据执行各式各样的计算(如求最小值,最大值,排序)
# 方案; 通过zip()将字典进行反转
prices = {
    'ACME': 45.32,
    'AAPL': 612.22,
    'IBM': 205.33,
    'HPQ': 27,
    'FB': 10.4
}
nim_price = min(zip(prices.values(),prices.keys()))
prices_sorted = sorted(zip(prices.values(),prices.keys()))
print(prices_sorted)
# 注意, zip()创建了一个迭代器,内容只能被消费一次, 如下面的代码会报错:
prices_and_name = zip(prices.values(),prices.keys())
print(min(prices_and_name))
#print(max(prices_and_name))

# 1.9 : 两个字典中寻找相同点
# 方案: 通过key()执行常见的集合操作
a = {'x': 1, 'y':2, 'z':3}
b = {'z': 5, 'w':6, 'y':7}
print(a.keys() & b.keys()) # 交集